package com.eastfair.auth.controller;

import com.eastfair.auth.entity.Organization;
import com.eastfair.auth.enumeration.OrganizationOrgTypeEnum;
import com.eastfair.auth.enumeration.ResourceOrganizationResourceTypeEnum;
import com.eastfair.auth.service.CompanyOrganizationService;
import com.eastfair.auth.service.OrganizationService;
import com.eastfair.auth.service.ProjectOrganizationService;
import com.eastfair.auth.dto.OrganizationDTO;
import com.eastfair.core.base.R;
import com.eastfair.echo.core.EchoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


/**
 * <p>
 * 公司controlelr
 *
 * </p>
 *
 * @author ligang
 * @date 2021-07-16
 */
@Slf4j
@Validated
@RestController
@RequestMapping("/companyOrganization")
@Api(value = "companyOrganization", tags = "")
public class CompanyOrganizationController {

    @Autowired
    private EchoService echoService;

    @Autowired
    CompanyOrganizationService companyOrganizationService;

    @Autowired
    ProjectOrganizationService projectOrganizationService;

    @Autowired
    OrganizationService organizationService;

    /**
     * 添加公司到项目
     * @param organizationDTO 组织实体DTO
     * @return
     */
    @ApiOperation(value = "添加公司", notes = "添加公司")
    @PostMapping("/addCompany")
    public R<Organization> addCompany(@RequestBody @Validated({OrganizationDTO.addCompanyByProject.class }) OrganizationDTO organizationDTO) {
        log.info("addCompany is execute");
        //资源类型
        organizationDTO.setResourceType(ResourceOrganizationResourceTypeEnum.COMPANY);
        //资源组织类型
        organizationDTO.setOrgType(OrganizationOrgTypeEnum.COMPANY);
        return companyOrganizationService.addCompany(organizationDTO);
    }


    /**
     * 修改公司
     * @param organizationDTO 组织实体DTO
     * @return
     */
    @ApiOperation(value = "修改公司", notes = "修改公司")
    @PostMapping("/updCompany")
    public R<Organization> updCompany(@RequestBody @Validated({OrganizationDTO.updCompanyByProject.class }) OrganizationDTO organizationDTO) {
        return companyOrganizationService.updCompany(organizationDTO);
    }
//    /**
//     * 将公司的管理员嫁接展会公司中
//     */
//    @ApiOperation(value = "将公司的管理员嫁接展会公司中", notes = "将公司的管理员嫁接展会公司中")
//    @PostMapping("/graftCompanyAdminUser")
//    public R graftCompanyAdminUser(@RequestBody @Validated({OrganizationDTO.graftCompanyAdminUser.class }) OrganizationDTO organizationDTO) {
//        return companyOrganizationService.graftCompanyAdminUser(organizationDTO.getOrgId(),organizationDTO.getResourceId());
//    }

    /**
     * 将节点上的角色赋值到该节点资源所在的公司类型节点上
     *
     * 说明：组织1：项目下的公司分类包含公司信息（项目级别的组织）
     *      组织2：公司组下的公司信息（公司级别组织）
     *      之所以将两个组织分开是因为员工应该在组织2里，不应该在组织1里。两者是单独的组织
     *      两个组织的资源id是一致的，当项目级别的组织赋角色给某公司时，公司组中的该公司也需要赋值同样的角色
     *      类似将节点的角色复制到另一个节点上，两个节点的纽带关系是资源id一致
     * @param organizationDTO 组织实体DTO
     * @return
     */
    @ApiOperation(value = "将节点上的角色赋值到该节点资源所在的公司类型节点上", notes = "将节点上的角色赋值到该节点资源所在的公司类型节点上")
    @PostMapping("/addRoleOfResource")
    public R addRoleOfResource(@RequestBody OrganizationDTO organizationDTO) {
        return companyOrganizationService.addRoleOfResource(organizationDTO.getOrgId());
    }

    /**
     * 将角色在该节点资源所在的公司类型节点上剔除
     * 说明：组织1：项目下的公司分类包含公司信息（项目级别的组织）
     *      组织2：公司组下的公司信息（公司级别组织）
     *      之所以将两个组织分开是因为员工应该在组织2里，不应该在组织1里。两者是单独的组织
     *      两个组织的资源id是一致的，当项目级别的组织赋角色给某公司时，公司组中的该公司也需要赋值同样的角色
     *      类似将节点的角色复制到另一个节点上，两个节点的纽带关系是资源id一致
     * @param organizationDTO 组织实体DTO
     * @return
     */
    @ApiOperation(value = "将角色在该节点资源所在的公司类型节点上剔除", notes = "将角色在该节点资源所在的公司类型节点上剔除")
    @PostMapping("/removeRoleOfResource")
    public R removeRoleOfResource(@RequestBody OrganizationDTO organizationDTO) {
        return companyOrganizationService.removeRoleOfResource(organizationDTO.getOrgId());
    }



    /**
     * 修改公司超级管理员
     * @param organizationDTO  resourceId 资源id userId 账户用户id
     * @return
     */
    @ApiOperation(value = "修改公司超级管理员", notes = "修改公司超级管理员")
    @PostMapping("/updUseridOfCompany")
    public R updUseridOfCompany(@RequestBody @Validated({OrganizationDTO.updUseridOfCompany.class }) OrganizationDTO organizationDTO) {
        return companyOrganizationService.addSysAdminUseridOfCompany(organizationDTO.getResourceId(),organizationDTO.getUserId());
    }



    /**
     * 剔除公司员工
     * @param organizationDTO  resourceId 资源id userIds 账户用户id集合
     * @return
     */
    @ApiOperation(value = "剔除公司员工", notes = "剔除公司员工")
    @PostMapping("/removeUseridOfCompany")
    public R removeUseridOfCompany(@RequestBody @Validated({OrganizationDTO.addUseridOfCompany.class }) OrganizationDTO organizationDTO) {
        return companyOrganizationService.removeUseridOfCompany(organizationDTO.getResourceId(),organizationDTO.getUserIds());
    }

    /**
     * 添加公司员工
     * @param organizationDTO  resourceId 资源id userIds 账户用户id集合
     * @return
     */
    @ApiOperation(value = "添加公司员工", notes = "添加公司员工")
    @PostMapping("/addUseridOfCompany")
    public R addUseridOfCompany(@RequestBody @Validated({OrganizationDTO.addUseridOfCompany.class }) OrganizationDTO organizationDTO) {
        return companyOrganizationService.addUseridOfCompany(organizationDTO.getResourceId(),organizationDTO.getUserIds());
    }



}



